package cn.qqtheme.framework.adapter; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.ImageView; import java.util.ArrayList; import java.util.Arrays; import cn.qqtheme.framework.http.ImageHelper; import cn.qqtheme.framework.util.ConvertUtils; /** * 图片数据适配。强烈建议设置图片宽高,不然加载网络图片时会比较杂乱 * * @author 李玉江[QQ:1032694760] * @since 2015/12/22 */ public final class ImageAdapter extends BaseAdapter { private static final int STRING = 0; private static final int INTEGER = 1; private static final int DRAWABLE = 2; private static final int BITMAP = 3; private static final int TAG_KEY_AVOID_CONFLICT_WITH_GLIDE = 0x20161023; private Context context; private int mode = STRING; private ArrayList<?> data = new ArrayList(); private ImageView.ScaleType scaleType = ImageView.ScaleType.FIT_XY; private OnImageClickListener onImageClickListener; private int width = ViewGroup.LayoutParams.WRAP_CONTENT; private int height = ViewGroup.LayoutParams.WRAP_CONTENT; private ImageAdapter(Context context) { this.context = context; } public static ImageAdapter with(Context context) { return new ImageAdapter(context); } public ImageAdapter resources(Integer[] data) { this.mode = INTEGER; this.data = new ArrayList<Integer>(Arrays.asList(data)); return this; } public ImageAdapter resources(ArrayList<Integer> data) { this.mode = INTEGER; this.data = data; return this; } public ImageAdapter urls(String[] data) { this.mode = STRING; this.data = new ArrayList<String>(Arrays.asList(data)); return this; } public ImageAdapter urls(ArrayList<String> data) { this.mode = STRING; this.data = data; return this; } public ImageAdapter bitmaps(ArrayList<Bitmap> data) { this.mode = BITMAP; this.data = data; return this; } public ImageAdapter drawables(ArrayList<Drawable> data) { this.mode = DRAWABLE; this.data = data; return this; } public ImageAdapter scaleType(ImageView.ScaleType scaleType) { this.scaleType = scaleType; return this; } /** * 单位为dp */ public ImageAdapter size(int width, int height) { this.width = ConvertUtils.toPx(context, width); this.height = ConvertUtils.toPx(context, height); return this; } public ImageAdapter itemClick(OnImageClickListener onImageClickListener) { this.onImageClickListener = onImageClickListener; return this; } public void replaceAll(ArrayList data) { this.data = data; notifyDataSetChanged(); } public void addAll(ArrayList data) { //noinspection unchecked this.data.addAll(data); notifyDataSetChanged(); } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(); convertView = new ImageView(context); ViewGroup.LayoutParams params; if (parent instanceof AbsListView) { //java.lang.ClassCastException: // android.view.ViewGroup$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams params = new AbsListView.LayoutParams(width, height); } else { params = new ViewGroup.LayoutParams(width, height); } convertView.setLayoutParams(params); viewHolder.imageView = (ImageView) convertView; viewHolder.imageView.setScaleType(scaleType); //加上key,避免和Glide框架冲突: You must not call setTag() on a view Glide is targeting convertView.setTag(TAG_KEY_AVOID_CONFLICT_WITH_GLIDE, viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(TAG_KEY_AVOID_CONFLICT_WITH_GLIDE); } final Object item = data.get(position); viewHolder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (onImageClickListener != null) { onImageClickListener.onImageClick(position, item); } } }); switch (mode) { case INTEGER: viewHolder.imageView.setImageResource((Integer) item); break; case DRAWABLE: viewHolder.imageView.setImageDrawable((Drawable) item); break; case BITMAP: viewHolder.imageView.setImageBitmap((Bitmap) item); break; default: ImageHelper.getInstance().display(item.toString(), viewHolder.imageView, width, height); break; } return convertView; } public interface OnImageClickListener { void onImageClick(int position, Object item); } private class ViewHolder { ImageView imageView; } }